// var mysql = require('mysql');
// var dbConfig = require('./db.config'); 


// module.exports = {
//     query : function(sql,params,callback){
//         //每次使用的时候需要创建链接，数据操作完成之后要关闭连接
//         var connection = mysql.createConnection(dbConfig);        
//         connection.connect(function(err){
//             if(err){
//                 console.log('数据库链接失败');
//                 throw err;
//             }
//          //开始数据操作
//         connection.query( sql, params, function(err,results,fields ){
//            if(err){
//                 console.log('数据操作失败');
//                 throw err;
//             }
//             //将查询出来的数据返回给回调函数，这个时候就没有必要使用错误前置的思想了，因为我们在这个文件中已经对错误进行了处理，如果数据检索报错，直接就会阻塞到这个文件中
//             callback && callback(JSON.parse(JSON.stringify(results)), JSON.parse(JSON.stringify(fields)));
//             //results作为数据操作后的结果，fields作为数据库连接的一些字段，大家可以打印到控制台观察一下
//                 //停止链接数据库，必须再查询语句后，要不然一调用这个方法，就直接停止链接，数据操作就会失败
//              connection.end(function(err){
//                   if(err){
//                       console.log('关闭数据库连接失败！');
//                       throw err;
//                   }
//               });
//            });
//        });
//     }
// };

var mysql = require("mysql");
// 创建连接池
var pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'text',
    port: 3306
});
// 连接公用方法
var query = function (sql, options, callback) {
    pool.getConnection(function (err, conn) {
        if (err) {
            callback(err, null, null);
        } else {
            conn.query(sql, options, function (err, results, fields) {
                //释放连接  
                conn.release();
                //事件驱动回调  
                // callback(err,results,fields);
                callback(err, results, fields) && callback(JSON.parse(JSON.stringify(results)), JSON.parse(JSON.stringify(fields)));
            });
        }
    });
};

//多更新和插入语句时，定义的回滚函数
var async = require("async");
var execTrans = function (sqlparamsEntities, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            return callback(err, null);
        }
        connection.beginTransaction(function (err) {
            if (err) {
                return callback(err, null);
            }
            //console.log("开始执行transaction，共执行" + sqlparamsEntities.length + "条数据");
            var funcAry = [];
            sqlparamsEntities.forEach(function (sql_param) {
                var temp = function (cb) {
                    var sql = sql_param.sql;
                    var param = sql_param.params;
                    connection.query(sql, param, function (tErr, rows, fields) {
                        if (tErr) {
                            connection.rollback(function () {
                                console.log("事务失败，" + sql_param + "，ERROR：" + tErr);
                                // throw tErr;
                                return callback(tErr, null);
                            });
                        } else {
                            return cb(null, 'ok');
                        }
                    })
                };
                funcAry.push(temp);
            });

            async.series(funcAry, function (err, result) {
                if (err) {
                    connection.rollback(function (err) {
                        console.log("transaction error: " + err);
                        connection.release();
                        return callback(err, null);
                    });
                } else {
                    connection.commit(function (err, info) {
                        //console.log("transaction info: " + JSON.stringify(info));
                        if (err) {
                            console.log("执行事务失败，" + err);
                            connection.rollback(function (err) {
                                console.log("transaction error: " + err);
                                connection.release();
                                return callback(err, null);
                            });
                        } else {
                            connection.release();
                            return callback(null, info);
                        }
                    })
                }
            })
        });
    });
}
 //初始化sql & params： 回滚操作时 需要调用此方法
 var _getNewSqlParamEntity= function (sql, params, callback) {
     if (callback) {
         return callback(null, {
             sql: sql,
             params: params
         });
     }
     return {
         sql: sql,
         params: params
     };
 }

module.exports = {
    'query': query,
    'execTrans':execTrans,
    '_getNewSqlParamEntity':_getNewSqlParamEntity
};